package com.pai4j.message.aggregation;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 聚合消息模型
 * 多条消息聚合成一条
 *
 * @author PAI4J Team
 * @date 2025-11-01
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AggregatedMessage implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 聚合消息ID
     */
    private String aggregatedId;

    /**
     * 消息类型
     */
    private String messageType;

    /**
     * 资源ID
     */
    private String resourceId;

    /**
     * 资源类型
     */
    private String resourceType;

    /**
     * 接收者ID
     */
    private String receiverId;

    /**
     * 发送者ID列表
     */
    @Builder.Default
    private List<String> senderIds = new ArrayList<>();

    /**
     * 发送者名称列表
     */
    @Builder.Default
    private List<String> senderNames = new ArrayList<>();

    /**
     * 原始消息ID列表
     */
    @Builder.Default
    private List<String> originalMessageIds = new ArrayList<>();

    /**
     * 聚合数量
     */
    private Integer aggregateCount;

    /**
     * 聚合内容（智能生成）
     * 例如："张三、李四等10人点赞了你的文章"
     */
    private String aggregatedContent;

    /**
     * 聚合开始时间
     */
    private LocalDateTime startTime;

    /**
     * 聚合结束时间
     */
    private LocalDateTime endTime;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 是否已发送
     */
    private Boolean sent;

    /**
     * 扩展数据
     */
    @Builder.Default
    private Map<String, Object> extData = new HashMap<>();

    /**
     * 添加发送者
     */
    public void addSender(String senderId, String senderName) {
        if (senderIds == null) {
            senderIds = new ArrayList<>();
        }
        if (senderNames == null) {
            senderNames = new ArrayList<>();
        }
        
        if (!senderIds.contains(senderId)) {
            senderIds.add(senderId);
            senderNames.add(senderName);
            aggregateCount = senderIds.size();
        }
    }

    /**
     * 生成聚合内容
     */
    public void generateAggregatedContent(String resourceTitle) {
        if (senderNames == null || senderNames.isEmpty()) {
            return;
        }

        StringBuilder content = new StringBuilder();
        
        int count = senderNames.size();
        if (count == 1) {
            content.append(senderNames.get(0));
        } else if (count == 2) {
            content.append(senderNames.get(0))
                   .append("、")
                   .append(senderNames.get(1));
        } else {
            content.append(senderNames.get(0))
                   .append("、")
                   .append(senderNames.get(1))
                   .append("等")
                   .append(count)
                   .append("人");
        }

        // 根据消息类型添加操作描述
        String action = getActionByMessageType();
        content.append(action);

        // 添加资源信息
        if (resourceTitle != null && !resourceTitle.isEmpty()) {
            content.append("你的").append(resourceTitle);
        }

        this.aggregatedContent = content.toString();
    }

    /**
     * 根据消息类型获取操作描述
     */
    private String getActionByMessageType() {
        if (messageType == null) {
            return "互动了";
        }

        if (messageType.contains("Like") || messageType.contains("点赞")) {
            return "点赞了";
        } else if (messageType.contains("Comment") || messageType.contains("评论")) {
            return "评论了";
        } else if (messageType.contains("Collect") || messageType.contains("收藏")) {
            return "收藏了";
        } else if (messageType.contains("Follow") || messageType.contains("关注")) {
            return "关注了";
        } else {
            return "互动了";
        }
    }
}

